
// 原始值(primitive values): 是一种既非对象也无属性或方法的数据
let x = 100;
console.log(x);

// 修改变量x的值
x = 200; 
console.log(x);

// 原始类型(primitive types): 是 原始值 的数据类型
// undefined、null、boolean、number、string、symbol、bigint
// 原始类型的值一经创建就不能被修改(即原始值都是不可变的)
let s;
console.log(s, typeof s); // `undefined` `undefined`

// 字面量 `undefined` 是 `undefined` 类型唯一的一个取值
s = undefined;
console.log(s, typeof s); // `undefined` `undefined`

// 字面量 `null` 是 `null` 类型唯一的一个取值
s = null;
// 问题: 为什么 typeof null 返回的是 `object`
console.log(s, typeof s); // `null` `object`

// boolean 类型只有两个取值: `true` 、`false`
s = true;
console.log(s, typeof s); // `true` `boolean`

// number 类型的取值包括 整数 和 浮点数
s = 100;
console.log(s, typeof s); // `100` `number`

s = 3.14;
console.log(s, typeof s); // `3.14` `number`

// string 类型的字面量可以使用 单引号 引起来
s = 'afang';
console.log(s, typeof s); // `afang` `string`

// string 类型的字面量可以使用 双引号 引起来
s = "defang";
console.log(s, typeof s); // `defang` `string`

let nickname = '阿芳';
// string 类型支持用 模板字面量(template literal)
s = `欢迎${nickname}`;
console.log(s, typeof s); // `欢迎阿芳` `string`

// symbol 类型的取值要通过 Symbol 函数来创建
s = Symbol('first');
console.log(s, typeof s); // `Symbol('first')` `symbol`
// symbol 类型的值通常用作鉴别符(每个symbol值都是独一无二的)
let y = Symbol('first');
console.log( s == y ); // false

// bigint 类型的字面量就是在整数末尾添加一个`n`做后缀
s = 12345678901234567890n;
console.log(s, typeof s); // `12345678901234567890n` `bigint`

// 当程序中需要使用 number 类型无法表示的大整数时可以使用 bigint 来表示
s = 9007199254740999n;
console.log(s, typeof s); // `9007199254740999n` `bigint`

console.log( '- - - - - - - - - - - - - - - - - - - - -' );

console.log('Number max safe integer: ', Number.MAX_SAFE_INTEGER );
console.log('Number min safe integer: ', Number.MIN_SAFE_INTEGER );

// 参考资料:
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
// https://developer.mozilla.org/zh-CN/docs/Glossary/Primitive

// 核心话题:
// JavaScript中的原始类型是既非对象也无属性或方法的数据的数据类型
// 原始数据类型(primitive data type)的值就是原始值(primitive value)
// 原始值都是不可变的(all primitives are immutable)